package tcpVerbindung;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.UnknownHostException;

import fehlerHandling.Warning;

public class TCPSendenEmpf extends Thread {

	private TCPAuswEmpf tcpEmpf;
	private TCPAuswSenden tcpAuswSenden;

	private boolean verbindungOK;
	private String ip = "172.24.104.177";
	//private String ip = "127.0.0.1";
	
	private int verbindungsVersuche;
	private int keineNachrichtErh;

	private java.net.Socket socket;

	public TCPSendenEmpf(TCPAuswEmpf tcpAuswEmpf, TCPAuswSenden tcpAuswSenden) {
		System.out.println("TCP gestartet");

		this.tcpEmpf = tcpAuswEmpf;
		this.tcpAuswSenden = tcpAuswSenden;

		verbindungOK = false;

		verbindungsVersuche = 0;
		keineNachrichtErh = 0;
	}

	public void run() {
		while (Thread.currentThread() != null) {

			if (verbindungOK == false) {
				System.out.println("Socket verbinden");
				socket = Socket();

				verbindungsVersuche++;
			}

			try {
				if (verbindungOK) {
					ablauf();

					verbindungsVersuche = 0;
				}
			} catch (IOException e) {
				try {
					socket.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

				verbindungsVersuche = 0;
				verbindungOK = false;

				// Dialog oeffnen
				try {
					throw new Warning("Verbindung zur SPS wurde getrennt.");
				} catch (Warning e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}

			if (verbindungsVersuche >= 2) {
				verbindungsVersuche = 0;
				verbindungOK = false;

				try {
					throw new Warning(
							"Verbindung zur SPS konnte nicht Aufgebaut werden, warten Sie einen Moment.");
				} catch (Warning e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			if (keineNachrichtErh > 20) {
				keineNachrichtErh = 0;
				verbindungOK = false;

				try {
					socket.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				// Dialog oeffnen
				try {
					throw new Warning("Verbindung zur SPS wurde getrennt.");
				} catch (Warning e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}

		}
	}

	private void ablauf() throws IOException {

		// nachricht schicken
		schreibeNachricht(socket, tcpAuswSenden.sendeNachricht());

		try {
			Thread.sleep(20);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// Antwort lesen
		leseNachricht(socket);
	}

	/**
	 * Nachricht an Socket schicken
	 * 
	 * @param socket1
	 * @param nachricht
	 * @throws IOException
	 */
	private void schreibeNachricht(java.net.Socket socket1, String nachricht)
			throws IOException {

		PrintWriter printWriter = null;
		printWriter = new PrintWriter(new OutputStreamWriter(
				socket1.getOutputStream()));
		
		printWriter.print(nachricht);
		printWriter.flush();
	}

	/**
	 * Nachricht Empfangen
	 * 
	 * @param socket1
	 * @return
	 * @throws IOException
	 */
	private void leseNachricht(java.net.Socket socket1) throws IOException {
		BufferedReader bufferedReader = new BufferedReader(
				new InputStreamReader(socket1.getInputStream()));
		char[] buffer = new char[512];
		int anzahlZeichen = bufferedReader.read(buffer, 0, 200); // blockiert
																	// bis
																	// Nachricht
																	// empfangen

		if (anzahlZeichen == -1) {
			System.out.println("Keine Nachricht erhalten");
			keineNachrichtErh++;
		} else {
			keineNachrichtErh = 0;

			String nachricht_2 = new String(buffer, 0, anzahlZeichen);

			tcpEmpf.datenEmpfangen(nachricht_2);
		}
	}

	/**
	 * Verbindung aufbauen zu SPS
	 */
	private java.net.Socket Socket() {
		java.net.Socket socket1 = null;
		int port = 2000;

		try {
			socket1 = new java.net.Socket(ip, port);
			verbindungOK = true;
			System.out.println("Socket bezogen: " + socket1
					+ " Verbindung steht");

		} catch (UnknownHostException e) {
		} catch (IOException e) {
		}

		return socket1;
	}
}